package Classes;

import java.util.ArrayList;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;


public class TestaRepositorioDeUsuarios {
        RepositorioDeUsuarios repositorio1;
        RepositorioDeUsuarios repositorio2;
        RepositorioDeUsuarios repositorio3;
        RepositorioDeUsuarios repositorio4;
        RepositorioDeUsuarios repositorio5;

        @Before
        public void criaRepositorios(){
            repositorio1 = new RepositorioDeUsuarios();
            repositorio2 = new RepositorioDeUsuarios();
            repositorio3 = new RepositorioDeUsuarios();
            repositorio4 = new RepositorioDeUsuarios();
            repositorio5 = new RepositorioDeUsuarios();
                
        }
        
        @Test
        public void testaAdicionaUsuario() throws Exception{
                Assert.assertTrue(repositorio1.getUsuarios().isEmpty());
                Assert.assertTrue(repositorio2.getUsuarios().isEmpty());
                
                Assert.assertTrue(repositorio1.adicionaUsuario(new Usuario("Guilherme", "30/03/2011", null)));
                Assert.assertTrue(repositorio2.adicionaUsuario(new Usuario("Danilo", "01/01/2011", null)));
                Assert.assertTrue(repositorio2.adicionaUsuario(new Usuario("Thiago", "20/02/2011", null)));
                
                Assert.assertEquals(1, repositorio1.getUsuarios().size());
                Assert.assertEquals(2, repositorio2.getUsuarios().size());
        }
        
        @Test
        public void testaGetUsuarios() throws Exception{
                ArrayList<Usuario> repositorioVazio = new ArrayList<Usuario>();
                
                repositorio1.adicionaUsuario(new Usuario("Guilherme", "30/03/2011", null));
                repositorio2.adicionaUsuario(new Usuario("Danilo", "01/01/2011", null));
                repositorio2.adicionaUsuario(new Usuario("Thiago", "20/02/2011", null));
                
                repositorio3.adicionaUsuario(new Usuario("Guilherme", "30/03/2011", null));
                repositorio4.adicionaUsuario(new Usuario("Danilo", "01/01/2011", null));
                repositorio4.adicionaUsuario(new Usuario("Thiago", "20/02/2011", null));
                
                Assert.assertEquals(repositorio3.getUsuarios(), repositorio1.getUsuarios());
                Assert.assertEquals(repositorio4.getUsuarios(), repositorio2.getUsuarios());
                Assert.assertEquals(repositorioVazio, repositorio5.getUsuarios());
        }
        @Test
        public void testaRemovePorObj() throws Exception{
                Usuario usuario1 = new Usuario("Guilherme", "30/03/2011", null);
                Usuario usuario2 = new Usuario("Danilo", "01/01/2011", null);
                Usuario usuario3 = new Usuario("Thiago", "20/02/2011", null);
                
        	
        		repositorio1.adicionaUsuario(usuario1);
                repositorio2.adicionaUsuario(usuario2);
                repositorio2.adicionaUsuario(usuario3);
                repositorio3.adicionaUsuario(usuario3);
                
                Assert.assertEquals(1, repositorio1.getUsuarios().size());
                Assert.assertEquals(2, repositorio2.getUsuarios().size());
                
                Assert.assertEquals(null, repositorio1.removePorObj(usuario3));
                Assert.assertEquals(usuario1, repositorio1.removePorObj(usuario1));
                Assert.assertEquals(usuario2, repositorio2.removePorObj(usuario2));
                
                Assert.assertTrue(repositorio1.getUsuarios().isEmpty());
                Assert.assertEquals(1, repositorio2.getUsuarios().size());
                Assert.assertEquals(repositorio3.getUsuarios(), repositorio2.getUsuarios());
        }
        
        @Test
        public void testaRemovePorIndice() throws Exception{
                repositorio1.adicionaUsuario(new Usuario("Guilherme", "30/03/2011", null));
                repositorio2.adicionaUsuario(new Usuario("Danilo", "01/01/2011", null));
                repositorio2.adicionaUsuario(new Usuario("Thiago", "20/02/2011", null));
                repositorio3.adicionaUsuario(new Usuario("Thiago", "20/02/2011", null));
                
                //TESTANDO INDICE MAIOR QUE O TAMANHO DA LISTA
                try{
                        repositorio1.removePorIndice(1);
                        Assert.fail("Era esperado tratamento de erro para indice invalido.");
                }catch (Exception e){
                        Assert.assertEquals("indice nao existe!", e.getMessage());
                }
                
                //TESTANDO INDICE MENOR QUE 0
                try{
                        repositorio1.removePorIndice(-1);
                        Assert.fail("Era esperado tratamento de erro para indice invalido.");
                }catch (Exception e){
                        Assert.assertEquals("indice nao existe!", e.getMessage());
                }
                
                repositorio2.removePorIndice(1);
                repositorio3.removePorIndice(0);
                
                Assert.assertEquals(1, repositorio1.getUsuarios().size());
                Assert.assertEquals(1, repositorio2.getUsuarios().size());
                Assert.assertEquals(0, repositorio3.getUsuarios().size());
        }
        
        @Test
        public void testaGetUsuario() throws Exception{
                Usuario usuario1 = new Usuario("Guilherme", "30/03/2011", null);
                Usuario usuario2 = new Usuario("Danilo", "01/01/2011", null);
                Usuario usuario3 = new Usuario("Thiago", "20/02/2011", null);
                
                repositorio1.adicionaUsuario(new Usuario("Guilherme", "30/03/2011", null));
                repositorio2.adicionaUsuario(new Usuario("Danilo", "01/01/2011", null));
                repositorio2.adicionaUsuario(new Usuario("Thiago", "20/02/2011", null));
                repositorio3.adicionaUsuario(new Usuario("Thiago", "20/02/2011", null));
                
                Assert.assertEquals(null, repositorio1.getUsuario("Nazareno"));
                Assert.assertEquals(usuario1, repositorio1.getUsuario("Guilherme"));
                Assert.assertEquals(usuario2, repositorio2.getUsuario("Danilo"));
                Assert.assertEquals(usuario3, repositorio2.getUsuario("Thiago"));
                Assert.assertEquals(usuario3, repositorio3.getUsuario("Thiago"));
        }
        
        @Test
        public void testaGetUsuarioPorIndice() throws Exception{
                Usuario usuario1 = new Usuario("Guilherme", "30/03/2011", null);
                Usuario usuario2 = new Usuario("Danilo", "01/01/2011", null);
                Usuario usuario3 = new Usuario("Thiago", "20/02/2011", null);
                
                repositorio1.adicionaUsuario(usuario1);
                repositorio2.adicionaUsuario(usuario2);
                repositorio2.adicionaUsuario(usuario3);
                repositorio3.adicionaUsuario(usuario3);
                
                //Testando para indice maior que o tamanho da lista
                try{
                        repositorio1.getUsuarioPorIndice(1);
                        Assert.fail("Era esperado tratamento de erro para indice invalido.");
                }catch (Exception e){
                        Assert.assertEquals("indice nao existe!", e.getMessage());
                }
                
                //Testando para indice menor que 0
                try{
                        repositorio1.getUsuarioPorIndice(-1);
                        Assert.fail("Era esperado tratamento de erro para indice invalido.");
                }catch (Exception e){
                        Assert.assertEquals("indice nao existe!", e.getMessage());
                }
                
                Assert.assertEquals(usuario3, repositorio2.getUsuarioPorIndice(1));
                Assert.assertEquals(usuario3, repositorio3.getUsuarioPorIndice(0));
        }
}